import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/*
 * 使用线程池将一个目录中的所有内容拷贝到另外一个目录中，包含子目录中的内容。
 * */
public class CallableCopyTest implements Callable {
    @Override
    public Object call() throws Exception {
        File str=new File("E:/dd");
        File dest=new File("E:/ww");
        this.CopyFiles(str,dest);
        return "拷贝完成！";
    }

    //定义一个复制一个目录及其子目录、文件到另外一个目录的方法
    public void CopyFiles(File str,File dest){
        FileInputStream fis= null;
        FileOutputStream fos= null;
        //先判断被拷贝文件（str)是否为目录,为目录进行创建，否则进行拷贝
        if(str.isDirectory()){
            //判断拷贝到的目录是否存在，不存在进行创建
            if(!dest.exists()){
                dest.mkdir();
                System.out.println("目录"+dest.getName()+"创建成功");
            }
            //创建一个String类型的数组接收file.list()方法返回的所有文件和目录文件名
            String[] Files=str.list();
            //遍历获取到的目录路径
            for (String file:Files
            ) {
                //根据参数指定的父路径和子路径信息构造对象
                File strFile=new File(str,file);
                File destFile=new File(dest,file);
                //使用递归进行目录及文件的逐级复制
                CopyFiles(strFile,destFile);

            }
        }else {
            try {
                // 1.创建FileInputStream类型的对象与str文件关联
                fis = new FileInputStream(str);
                // 2.创建FileOutputStream类型的对象与dest文件关联
                fos = new FileOutputStream(dest);
                // 3.准备一个相对适当的缓冲区，分多次将文件拷贝完成
                byte[] bArr=new byte[1024];
                int res=0;
                if((res=fis.read(bArr))!=-1){
                    fos.write(bArr,0,res);
                }
                System.out.println("正在复制文件："+str.getName());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(null !=fos){
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(null !=fis){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }



        }
    }


    public static void main(String[] args) {
        CallableCopyTest cct=new CallableCopyTest();
        //创建FutureTask类对象，根据参数指定的引用来创建一个未来任务
        FutureTask ft=new FutureTask(cct);
        //创建线程
        Thread t1=new Thread(ft);
        t1.start();
        Object obj = null;
        try {
            obj = ft.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("线程执行结果：" + obj); // 50005000
    }

}